#!/bin/bash
#
#********************************************************
#Author:                            jiangkang
#Date:                              2024-08-26
#FileName:                          swap.sh
#Description:                       一键开启swap交换区
#********************************************************

swap_dir="swap"
swap_file="swap-disk"
memory=`free -h | awk -v FS='( )+' NR==2'{print $2}' | grep -E '^([0-9])' -o`

function Swap()
{
  if [ -d /${swap_dir} ];then
    echo "swap目录已经存在,不需要打开!"
    exit 1
  fi

  #创建swap目录
  mkdir -p /${swap_dir}/
  #创建swap-dis文件并完成后续操作
  touch /${swap_dir}/${swap_file}

  #判定并安装bc命令
  bc --version > /dev/null
  if [ $? -ne 0 ];then
    echo "没有bc命令,帮忙安装bc"
    if command -v apt-get &> /dev/null;then
      apt-get -y bc
      echo "apt-get安装bc成功"
    elif command -v yum &> /dev/null;then
      yum install -y bc
      echo "yum安装bc成功"
    else
      echo "没有合适的包管理器,退出!"
      exit 1
    fi
  fi
    
  # 修正memory的值
  if [ ${memory} -ne 1 -a $((${memory}%2)) -ne 0 ];then
    memory=$((${memory}+1))
  fi

  if [ ${memory} -le 2 ];then
    memory=$((${memory}*2))
  elif [ ${memory} -gt 8 ];then
    memory=`echo "scale=0;${memory}*0.5/1" | bc`
  elif [ ${memory} -gt 32 ];then
    memory=4
  fi
  echo "经过计算,当前机器swap交换区开启${memory}G大小的空间"
  echo "###################################################"
  
  # 往swap-disk文件中写入数据
  echo "开始往/${swap_dir}/${swap_file}文件中写入${memory}G数据" 
  cnt=$((${memory}*1024))
  dd if=/dev/zero of=/${swap_dir}/${swap_file} bs=1M count=${cnt}
  echo "写入完成,开启swap交换区"
  # 赋权并打开swap交换区
  chmod 0600 /${swap_dir}/${swap_file}
  mkswap /${swap_dir}/${swap_file}
  swapon /${swap_dir}/${swap_file}
  sed -i '$a /swap/swap-disk swap swap sw,pri=32767 0 0' /etc/fstab
  echo "想要最终配置生效,请执行'reboot'操作重启机器"
}
Swap
